home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / C and C++ / flight simulator ƒ / plotptsFx.c < prev    next >
Text File  |  1989-11-09  |  8KB  |  291 lines

  1. /*
  2. #include <Quickdraw.h>
  3. #include <EventMgr.h>
  4. */
  5. #include <math.h>
  6. #include <defines.h>
  7. #include "perspect.h"
  8.  
  9.  
  10. FxVector    fcubes[8] = {{-1, -1, -1}, {1, -1, -1}, {1, 1, -1},
  11. {-1, 1, -1}, {-1, 1, 1}, {-1, -1, 1}, {1, -1, 1}, {1, 1, 1}};
  12.  
  13. Point    Origin = {128, 128};
  14. int        magnify = 0;
  15. FxThreeMatrx    fxRotMatrx;
  16.  
  17.  
  18. /**** Matrix to rotate 3-vector on three axes ****/
  19. FxMkRotMat(Xrot, Yrot, Zrot, matrx)
  20. double Xrot, Yrot, Zrot;
  21. register    FxThreeMatrx matrx;
  22. {
  23.     double cXrot , cYrot , cZrot ;
  24.     double sXrot , sYrot , sZrot ;
  25.  
  26.     cXrot = cos(Xrot);
  27.     cYrot = ldexp(cos(Yrot), magnify);
  28.     cZrot = cos(Zrot);
  29.     sXrot = sin(Xrot);
  30.     sYrot = ldexp(sin(Yrot), magnify);
  31.     sZrot = sin(Zrot);
  32.  
  33.     matrx[0][0] = DToFix(cYrot * cZrot);
  34.     matrx[0][1] = DToFix(cZrot * sXrot * sYrot - ldexp(sZrot * cXrot, magnify));
  35.     matrx[0][2] = DToFix(-(cXrot * cZrot * sYrot + ldexp(sXrot * sZrot, magnify)));
  36.     matrx[1][0] = DToFix(sZrot * cYrot);
  37.     matrx[1][1] = DToFix(sXrot * sYrot * sZrot + ldexp(cXrot * cZrot, magnify));
  38.     matrx[1][2] = DToFix(-sYrot * sZrot * cXrot + ldexp(sXrot * cZrot, magnify));
  39.     matrx[2][0] = DToFix(sYrot);
  40.     matrx[2][1] = DToFix(-sXrot * cYrot);
  41.     matrx[2][2] = DToFix(cXrot * cYrot);
  42. }
  43. /*    matrx[0][0] = cYrot * cZrot
  44.     matrx[0][1] = cZrot * sXrot * sYrot - sZrot * cXrot
  45.     matrx[0][2] = -(cXrot * cZrot * sYrot + sXrot * sZrot)
  46.     matrx[1][0] = sZrot * cYrot
  47.     matrx[1][1] = sXrot * sYrot * sZrot + cXrot * cZrot
  48.     matrx[1][2] = -sYrot * sZrot * cXrot + sXrot * cZrot
  49.     matrx[2][0] = sYrot
  50.     matrx[2][1] = -sXrot * cYrot
  51.     matrx[2][2] = cXrot * cYrot*/
  52.  
  53.  
  54. FracXRotatMatrx(cXrot, sXrot, oMatrx)
  55. Fract    cXrot, sXrot;
  56. register    FracThreeMatrx    oMatrx;
  57. {
  58.     FracThreeMatrx    tMatrx;
  59.  
  60.     tMatrx[0][0] = oMatrx[0][0];
  61.     tMatrx[0][1] = oMatrx[0][1];
  62.     tMatrx[0][2] = oMatrx[0][2];
  63.     tMatrx[1][0] = FracMul(oMatrx[1][0], cXrot) + FracMul(oMatrx[2][0], sXrot);
  64.     tMatrx[1][1] = FracMul(oMatrx[1][1], cXrot) + FracMul(oMatrx[2][1], sXrot);
  65.     tMatrx[1][2] = FracMul(oMatrx[1][2], cXrot) + FracMul(oMatrx[2][2], sXrot);
  66.     tMatrx[2][0] = FracMul(oMatrx[2][0], cXrot) - FracMul(oMatrx[1][0], sXrot);
  67.     tMatrx[2][1] = FracMul(oMatrx[2][1], cXrot) - FracMul(oMatrx[1][1], sXrot);
  68.     tMatrx[2][2] = FracMul(oMatrx[2][2], cXrot) - FracMul(oMatrx[1][2], sXrot);
  69.     *(FracThreeMatrxStrc *)(oMatrx) = *(FracThreeMatrxStrc *)(tMatrx);
  70. }
  71.  
  72. FracYRotatMatrx(cYrot, sYrot, oMatrx)
  73. Fract    cYrot, sYrot;
  74. register    FracThreeMatrx    oMatrx;
  75. {
  76.     FracThreeMatrx    tMatrx;
  77.  
  78.     tMatrx[0][0] = FracMul(oMatrx[0][0], cYrot) - FracMul(oMatrx[2][0], sYrot);
  79.     tMatrx[0][1] = FracMul(oMatrx[0][1], cYrot) - FracMul(oMatrx[2][1], sYrot);
  80.     tMatrx[0][2] = FracMul(oMatrx[0][2], cYrot) - FracMul(oMatrx[2][2], sYrot);
  81.     tMatrx[1][0] = oMatrx[1][0];
  82.     tMatrx[1][1] = oMatrx[1][1];
  83.     tMatrx[1][2] = oMatrx[1][2];
  84.     tMatrx[2][0] = FracMul(oMatrx[0][0], sYrot) + FracMul(oMatrx[2][0], cYrot);
  85.     tMatrx[2][1] = FracMul(oMatrx[0][1], sYrot) + FracMul(oMatrx[2][1], cYrot);
  86.     tMatrx[2][2] = FracMul(oMatrx[0][2], sYrot) + FracMul(oMatrx[2][2], cYrot);
  87.     *(FracThreeMatrxStrc *)(oMatrx) = *(FracThreeMatrxStrc *)(tMatrx);
  88. }
  89.  
  90. FracZRotatMatrx(cZrot, sZrot, oMatrx)
  91. Fract    cZrot, sZrot;
  92. register    FracThreeMatrx    oMatrx;
  93. {
  94.     FracThreeMatrx    tMatrx;
  95.  
  96.     tMatrx[0][0] = FracMul(oMatrx[0][0], cZrot) - FracMul(oMatrx[1][0], sZrot);
  97.     tMatrx[0][1] = FracMul(oMatrx[0][1], cZrot) - FracMul(oMatrx[1][1], sZrot);
  98.     tMatrx[0][2] = FracMul(oMatrx[0][2], cZrot) - FracMul(oMatrx[1][2], sZrot);
  99.     tMatrx[1][0] = FracMul(oMatrx[1][0], cZrot) + FracMul(oMatrx[0][0], sZrot);
  100.     tMatrx[1][1] = FracMul(oMatrx[1][1], cZrot) + FracMul(oMatrx[0][1], sZrot);
  101.     tMatrx[1][2] = FracMul(oMatrx[1][2], cZrot) + FracMul(oMatrx[0][2], sZrot);
  102.     tMatrx[2][0] = oMatrx[2][0];
  103.     tMatrx[2][1] = oMatrx[2][1];
  104.     tMatrx[2][2] = oMatrx[2][2];
  105.     *(FracThreeMatrxStrc *)(oMatrx) = *(FracThreeMatrxStrc *)(tMatrx);
  106. }
  107.  
  108. FractToFixMatrx(srcMat, destMat)
  109. register    FracThreeMatrx srcMat;
  110. register    FxThreeMatrx destMat;
  111. {
  112.     register    int    i, j;
  113.     
  114.     for (i = 0; i < 3; i++)
  115.         for (j = 0; j < 3; j++)
  116.             destMat[i][j] = Frac2Fix(srcMat[i][j]);
  117. }
  118.  
  119. FxTranspMatrx(srcMat, destMat)
  120. register    FracThreeMatrx srcMat;
  121. register    FxThreeMatrx destMat;
  122. {
  123.     register    int    i, j;
  124.     
  125.     for (i = 0; i < 3; i++)
  126.         for (j = 0; j < 3; j++)
  127.             destMat[i][j] = srcMat[j][i];
  128. }
  129.  
  130. FxMatrxMul(mat, vect, resVect)
  131. register    FxThreeMatrx mat;
  132. register    FxVector *vect;
  133. register    FxVector *resVect;
  134. {
  135.     resVect->x = _FixMul(mat[0][0], vect->x) + _FixMul(mat[0][1], vect->y) + _FixMul(mat[0][2], vect->z);
  136.     resVect->y = _FixMul(mat[1][0], vect->x) + _FixMul(mat[1][1], vect->y) + _FixMul(mat[1][2], vect->z);
  137.     resVect->z = _FixMul(mat[2][0], vect->x) + _FixMul(mat[2][1], vect->y) + _FixMul(mat[2][2], vect->z);
  138. }
  139.  
  140. FxMatrxByMatrx(mat1, mat2, resMat)
  141. register    FxThreeMatrx mat1, mat2, resMat;
  142. {
  143.     register    int    i, j;
  144.  
  145.     for(i = 0; i < 3; i++)
  146.         for(j = 0; j < 3; j++)
  147.         {
  148.             resMat[i][j] = _FixMul(mat1[i][0], mat2[0][j])
  149.                 + _FixMul(mat1[i][1], mat2[1][j])
  150.                 + _FixMul(mat1[i][2], mat2[2][j]);
  151.         }
  152. }
  153.  
  154. FxSubtVector(a, b, result)
  155. register    FxVector    *a, *b, *result;
  156. {
  157.     result->x = a->x - b->x;
  158.     result->y = a->y - b->y;
  159.     result->z = a->z - b->z;
  160. }
  161.  
  162. FxAddVector(a, b, result)
  163. register    FxVector    *a, *b, *result;
  164. {
  165.     result->x = a->x + b->x;
  166.     result->y = a->y + b->y;
  167.     result->z = a->z + b->z;
  168. }
  169.  
  170. FxPlotLine(strt, end)
  171. FxVector    *strt, *end;
  172. {
  173.     FxVector     delta;
  174.     FxVector    resStrt, resEnd;
  175.     Boolean    strtFlgs[5], endFlgs[5], done, clipped;
  176. register    int        i;
  177. register    Boolean        noneSet;
  178.  
  179.     delta.x = end->x - strt->x;
  180.     delta.y = end->y - strt->y;
  181.     delta.z = end->z - strt->z;
  182.     resStrt = *strt;
  183.     resEnd = *end;
  184.  
  185.     FxEvalPoint(&resStrt, strtFlgs);
  186.     FxEvalPoint(&resEnd, endFlgs);
  187.  
  188.     done = clipped = FALSE;
  189.     while (NOT(done))
  190.     {
  191.         for (i = 0; i < 5; i++)
  192.             if (strtFlgs[i] AND endFlgs[i])
  193.                 return;
  194.         i = 0;
  195.         while ((i < 4) AND NOT(strtFlgs[i]))
  196.             i++;
  197.         if (i < 4)
  198.         {
  199.             FxPush(&resStrt, &delta, i);
  200.             clipped = TRUE;
  201.             FxEvalPoint(&resStrt, strtFlgs);
  202.         }
  203.         else
  204.         {
  205.             i = 0;
  206.             while ((i < 4) AND NOT(endFlgs[i]))
  207.                 i++;
  208.             if (i < 4)
  209.             {
  210.                 FxNegatVect(&delta);
  211.                 FxPush(&resEnd, &delta, i);
  212.                 FxNegatVect(&delta);
  213.                 clipped = TRUE;
  214.                 FxEvalPoint(&resEnd, endFlgs);
  215.             }
  216.             else
  217.             {
  218.                 FxDraw(&resStrt, &resEnd, clipped);
  219.                 done = TRUE;
  220.             }
  221.         }
  222.     }
  223. }
  224.  
  225. FxNegatVect(theVect)
  226. register    FxVector    *theVect;
  227. {
  228.     theVect->x = -theVect->x;
  229.     theVect->y = -theVect->y;
  230.     theVect->z = -theVect->z;
  231. }
  232.  
  233. FxEvalPoint(theVect, flgArr)
  234. register    FxVector    *theVect;
  235. register    Boolean    flgArr[5];
  236. {
  237.     flgArr[0] = theVect->x > theVect->z;
  238.     flgArr[1] = theVect->z > -theVect->x;
  239.     flgArr[2] = theVect->y > -theVect->x;
  240.     flgArr[3] = theVect->x > theVect->y;
  241.     flgArr[4] = theVect->x >= 0;
  242. }
  243.  
  244. FxPush(theVect, delta, plane)
  245. register    FxVector    *theVect, *delta;
  246. int        plane;
  247. {
  248.     Fixed    t;
  249.  
  250.     switch (plane) {
  251.     case 0:
  252.         t = FixDiv(theVect->z - theVect->x, delta->x - delta->z);
  253.         theVect->x = _FixMul(delta->x, t) + theVect->x;
  254.         theVect->y = _FixMul(delta->y, t) + theVect->y;
  255.         theVect->z = theVect->x;
  256.         break;
  257.     case 1:
  258.         t = FixDiv(-(theVect->x + theVect->z), delta->x + delta->z);
  259.         theVect->x = _FixMul(delta->x, t) + theVect->x;
  260.         theVect->y = _FixMul(delta->y, t) + theVect->y;
  261.         theVect->z = -theVect->x;
  262.         break;
  263.     case 2:
  264.         t = FixDiv(-(theVect->x + theVect->y), delta->x + delta->y);
  265.         theVect->x = _FixMul(delta->x, t) + theVect->x;
  266.         theVect->y = -theVect->x;
  267.         theVect->z = _FixMul(delta->z, t) + theVect->z;
  268.         break;
  269.     case 3:
  270.         t = FixDiv(theVect->x - theVect->y, delta->y - delta->x);
  271.         theVect->x = _FixMul(delta->x, t) + theVect->x;
  272.         theVect->y = theVect->x;
  273.         theVect->z = _FixMul(delta->z, t) + theVect->z;
  274.         break;
  275.     }
  276. }        
  277.     
  278. FxDraw(strt, end, clipped)
  279. register    FxVector        *strt, *end;
  280. Boolean        clipped;
  281. {
  282.     int        strtH, strtV, endH, endV;
  283.  
  284.     strtH = FixToi(FixDiv(strt->y, -strt->x) << 7) + Origin.h;
  285.     strtV = FixToi(FixDiv(-strt->z, -strt->x) << 7) + Origin.v;
  286.     endH = FixToi(FixDiv(end->y, -end->x) << 7) + Origin.h;
  287.     endV = FixToi(FixDiv(-end->z, -end->x) << 7) + Origin.v;
  288.  
  289.     MoveTo(strtH, strtV);
  290.     LineTo(endH, endV);
  291. }